-- Array
-- Create by weism
-- 数组数据结构的实现（便于和字符串区分，LPC需要）

Array = {
    array = true, -- 指明这是对应LPC的数组
    e = {},     -- 数组的元素
};
Array.__index = Array;

-- 数组相加
function Array.__add(a, b)
    local r = Array.new();
    for i = 1, #a.e do
        table.insert(r.e, a.e[i]);
    end
    for i = 1, #b.e do
        table.insert(r.e, b.e[i]);
    end
    
    return r;
end

-- 创建一个空数组
function Array.new(t)
    local self = {};
    setmetatable(self, Array);
    self.array = true;
    if (t == nil) then
        self.e = {};
    else
        self.e = t;
    end
    return self;
end

-- 设置元素(非插入)，如果元素超过范围，将会报错
function Array:set(index, v)
    if index > table.getn(self.e) then
        assert(false, "超过范围了  ");
        return;
    end
    
    self.e[index] = v;
end

-- 插入元素
function Array:insert(index, v)
    -- 下标从1开始
    if index == 0 then index = 1 end

    if index > table.getn(self.e) then
        if table.getn(self.e) == 0 then
            self.e[1] = v;
        else
            table.insert(self.e, v);
        end
    else
        table.insert(self.e, index, v);
    end
end

-- 删除元素
function Array:remove(index)
    if index > table.getn(self.e) then
        assert(false, "超过范围了  ");
        return;
    end
    
    table.remove(self.e, index);
end

-- 取得元素
function Array:get(index)
    if index > table.getn(self.e) then
        assert(false, "超过范围了  ");
        return;
    end
    
    return self.e[index];
end

-- 元素个数
function Array:size()
    return table.getn(self.e);
end

-- 转换为普通的table
function Array:toTable()
    return self.e;
end

-- 测试函数
function Array.test()
    local arr = Array.new();
    arr:insert(1, "a");
    arr:insert(2, "b");
    arr:insert(1, "c");
    
    arr:remove(3);
    assert(arr:get(1) == "c" and arr:get(2) == "a" and arr:size() == 2, "测试失败");
end

